# 通过装饰器实现单例模式，只要任意一个类使用该装饰器，就会变成一个单例模式的类
import random


def decorator(cls):
    def wrapper(*args,**kwargs):
        if not hasattr(cls,"__instance"):
            cls.__instance=cls(*args,**kwargs)
        return cls.__instance
    return wrapper

class single:
    def __init__(self,cls):
        self.cls=cls
    def __call__(self, *args, **kwargs):
        if not hasattr(self.cls,"__instance"):
            self.cls.__instance=self.cls(*args,**kwargs)
        return self.cls.__instance


@decorator
class Demo:
    pass

c=Demo()
d=Demo()
f=Demo()
print(c,d,f)
# # 2、实现一个类，前五次创建对象，每次都可以返回一个新对象，第六次开始，每次创建，都随机返回前5个对象中的一个
class Singles(object):
    __instance_list = []
    def __new__(cls, *args, **kwargs):
        if len(cls.__instance_list)<5:
            obj=super().__new__(cls)
            cls.__instance_list.append(obj)
            return obj
        else:
            return random.choice(cls.__instance_list)

obj1=Singles(1)
obj2=Singles(2)
obj3=Singles(3)
obj4=Singles(4)
obj5=Singles(5)
obj6=Singles(6)
print(obj1,obj2,obj3,obj4,obj5,obj6)


# # 3、通过类实现一个装饰器，既可以装饰函数，又可以装饰类，不管传不传参数都能使用
class Decorator(object):
    def __init__(self,item):
        self.item=item
    def __call__(self, *args, **kwargs):
        res=self.item(*args, **kwargs)
        return res

@Decorator
def func4():
    print("----new----")

@Decorator
class C:
    print("----hello-----")

func4()
C()

# 用装饰器函数实现

def deco2(item):
    def wrapper(*args,**kwargs):
        res=item(*args,**kwargs)
        return res
    return wrapper

@deco2
class D:
    print("----hello2-----")


c=D()



